å¹ççãªã¬ã³ããªã³ã°ã®ãããWebGLã·ã§ãŒããŒã®ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ããçè§£ã管çããããã®å æ¬çã¬ã€ãã
WebGLã·ã§ãŒããŒãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãïŒãªãœãŒã¹ã¢ã¿ããã¡ã³ã管ç
WebGLã«ãããŠãã·ã§ãŒããŒã¯GPUäžã§å®è¡ããããªããžã§ã¯ããã©ã®ããã«ã¬ã³ããªã³ã°ãããããæ±ºå®ããããã°ã©ã ã§ãããããã®ã·ã§ãŒããŒã¯ããã¯ã¹ãã£ããããã¡ãuniform倿°ãªã©ãããŸããŸãªãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¿ èŠãšããŸãããªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãã¯ããããã®ãªãœãŒã¹ãã·ã§ãŒããŒããã°ã©ã ã«æ¥ç¶ããããã®ã¡ã«ããºã ãæäŸããŸãããããã®ãã€ã³ãã£ã³ã°ãã€ã³ãã广çã«ç®¡çããããšã¯ãWebGLã¢ããªã±ãŒã·ã§ã³ã§æé©ãªããã©ãŒãã³ã¹ãšæè»æ§ãå®çŸããããã«äžå¯æ¬ ã§ãã
ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãã®çè§£
ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãã¯ãæ¬è³ªçã«ã·ã§ãŒããŒããã°ã©ã å ã®ã€ã³ããã¯ã¹ãŸãã¯å Žæã§ãããç¹å®ã®ãªãœãŒã¹ãã¢ã¿ãããããå Žæã§ããããã¯ãããŸããŸãªãªãœãŒã¹ãæ¥ç¶ã§ããååä»ãã®ã¹ãããã®ãããªãã®ã ãšèããŠãã ããããããã®ãã€ã³ãã¯ãGLSLã·ã§ãŒããŒã³ãŒãå ã§ã¬ã€ã¢ãŠã修食åã䜿çšããŠå®çŸ©ãããŸãããããã¯ãã·ã§ãŒããŒã®å®è¡æã«WebGLãããŒã¿ã«ã©ãã§ãã©ã®ããã«ã¢ã¯ã»ã¹ããããæ±ºå®ããŸãã
ãã€ã³ãã£ã³ã°ãã€ã³ãã¯ãªãéèŠãïŒ
- å¹çæ§ïŒãã€ã³ãã£ã³ã°ãã€ã³ããé©åã«ç®¡çããããšã§ããªãœãŒã¹ã¢ã¯ã»ã¹ã«é¢é£ãããªãŒããŒããããå€§å¹ ã«åæžããã¬ã³ããªã³ã°æéãççž®ã§ããŸãã
- æè»æ§ïŒãã€ã³ãã£ã³ã°ãã€ã³ãã«ãããã·ã§ãŒããŒã³ãŒãèªäœã倿Žããããšãªããã·ã§ãŒããŒã䜿çšãããªãœãŒã¹ãåçã«åãæ¿ããããšãã§ããŸããããã¯ãå€ç®çã§é©å¿æ§ã®ããã¬ã³ããªã³ã°ãã€ãã©ã€ã³ãäœæããããã«äžå¯æ¬ ã§ãã
- æŽçïŒãã€ã³ãã£ã³ã°ãã€ã³ãã¯ãã·ã§ãŒããŒã³ãŒããæŽçããããŸããŸãªãªãœãŒã¹ãã©ã®ããã«äœ¿çšãããŠããããçè§£ããããããã®ã«åœ¹ç«ã¡ãŸãã
ãªãœãŒã¹ãšãã€ã³ãã£ã³ã°ãã€ã³ãã®çš®é¡
WebGLã§ã¯ãããã€ãã®çš®é¡ã®ãªãœãŒã¹ããã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãã§ããŸãïŒ
- ãã¯ã¹ãã£ïŒè¡šé¢ã®ãã£ããŒã«ãè²ããŸãã¯ãã®ä»ã®èŠèŠæ å ±ãæäŸããããã«äœ¿çšãããç»åã
- Uniform Buffer Object (UBO)ïŒå¹ççã«æŽæ°ã§ããuniform倿°ã®ãããã¯ãå€ãã®uniformããŸãšããŠå€æŽããå¿ èŠãããå Žåã«ç¹ã«äŸ¿å©ã§ãã
- Shader Storage Buffer Object (SSBO)ïŒUBOã«äŒŒãŠããŸãããã·ã§ãŒããŒã«ãã£ãŠèªã¿æžãå¯èœãªå€§éã®ããŒã¿çšã«èšèšãããŠããŸãã
- ãµã³ãã©ãŒïŒãã¯ã¹ãã£ãã©ã®ããã«ãµã³ããªã³ã°ããããïŒãã£ã«ã¿ãªã³ã°ãããããããã³ã°ãªã©ïŒãå®çŸ©ãããªããžã§ã¯ãã
ãã¯ã¹ãã£ãŠããããšãã€ã³ãã£ã³ã°ãã€ã³ã
æŽå²çã«ãWebGL 1.0 (OpenGL ES 2.0)ã¯ãã¯ã¹ãã£ãŠãããïŒäŸïŒgl.TEXTURE0, gl.TEXTURE1ïŒã䜿çšããŠãã·ã§ãŒããŒå
ã®ãµã³ãã©ãŒã«ã©ã®ãã¯ã¹ãã£ããã€ã³ãããããæå®ããŠããŸããããã®ã¢ãããŒãã¯çŸåšãæå¹ã§ãããWebGL 2.0 (OpenGL ES 3.0)ã§ã¯ãã¬ã€ã¢ãŠã修食åã䜿çšãããããæè»ãªãã€ã³ãã£ã³ã°ãã€ã³ãã·ã¹ãã ãå°å
¥ãããŸããã
WebGL 1.0 (OpenGL ES 2.0) - ãã¯ã¹ãã£ãŠãããïŒ
WebGL 1.0ã§ã¯ããã¯ã¹ãã£ãŠããããæå¹åããããã«ãã¯ã¹ãã£ããã€ã³ãããŸãïŒ
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, myTexture);
gl.uniform1i(mySamplerUniformLocation, 0); // 0ã¯gl.TEXTURE0ãåç
§ããŸã
ã·ã§ãŒããŒåŽïŒ
uniform sampler2D mySampler;
// ...
vec4 color = texture2D(mySampler, uv);
WebGL 2.0 (OpenGL ES 3.0) - ã¬ã€ã¢ãŠã修食åïŒ
WebGL 2.0ã§ã¯ãlayout修食åã䜿çšããŠã·ã§ãŒããŒã³ãŒãå
ã§ãã€ã³ãã£ã³ã°ãã€ã³ããçŽæ¥æå®ã§ããŸãïŒ
layout(binding = 0) uniform sampler2D mySampler;
// ...
vec4 color = texture(mySampler, uv);
JavaScriptã³ãŒãåŽïŒ
gl.activeTexture(gl.TEXTURE0); // åžžã«å¿
èŠã§ã¯ãããŸããããè¯ãç¿æ
£ã§ã
gl.bindTexture(gl.TEXTURE_2D, myTexture);
äž»ãªéãã¯ãlayout(binding = 0)ãã·ã§ãŒããŒã«å¯Ÿãããµã³ãã©ãŒmySamplerããã€ã³ãã£ã³ã°ãã€ã³ã0ã«ãã€ã³ããããŠããããšãäŒããç¹ã§ãããã¯ã¹ãã£ããã€ã³ãããã«ã¯äŸç¶ãšããŠ`gl.bindTexture`ã䜿çšããå¿
èŠããããŸãããã·ã§ãŒããŒã¯ãã€ã³ãã£ã³ã°ãã€ã³ãã«åºã¥ããŠã©ã®ãã¯ã¹ãã£ã䜿çšãã¹ãããæ£ç¢ºã«ç¥ãããšãã§ããŸãã
GLSLã§ã®ã¬ã€ã¢ãŠã修食åã®äœ¿çš
layout修食åã¯ãWebGL 2.0以éã§ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãã管çããããã®éµã§ããããã«ãããã·ã§ãŒããŒã³ãŒãå
ã§çŽæ¥ãã€ã³ãã£ã³ã°ãã€ã³ããæå®ã§ããŸãã
æ§æ
layout(binding = , other_qualifiers) ;
binding =ïŒãã€ã³ãã£ã³ã°ãã€ã³ãã®æŽæ°ã€ã³ããã¯ã¹ãæå®ããŸãããã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ã¯ãåãã·ã§ãŒããŒã¹ããŒãžïŒé ç¹ããã©ã°ã¡ã³ããªã©ïŒå ã§äžæã§ãªããã°ãªããŸãããother_qualifiersïŒUBOã¬ã€ã¢ãŠãçšã®std140ãªã©ããªãã·ã§ã³ã®ä¿®é£ŸåãïŒãªãœãŒã¹ã®åïŒäŸïŒsampler2DãuniformãbufferïŒãïŒãªãœãŒã¹å€æ°åã
äŸ
ãã¯ã¹ãã£
layout(binding = 0) uniform sampler2D diffuseTexture;
layout(binding = 1) uniform sampler2D normalMap;
Uniform Buffer Object (UBO)
layout(binding = 2, std140) uniform Matrices {
mat4 modelViewProjectionMatrix;
mat4 normalMatrix;
};
Shader Storage Buffer Object (SSBO)
layout(binding = 3) buffer Particles {
vec4 position[ ];
vec4 velocity[ ];
};
JavaScriptã§ã®ãã€ã³ãã£ã³ã°ãã€ã³ãã®ç®¡ç
layout修食åã¯ã·ã§ãŒããŒå
ã§ãã€ã³ãã£ã³ã°ãã€ã³ããå®çŸ©ããŸãããå®éã®ãªãœãŒã¹ã¯JavaScriptã³ãŒãã§ãã€ã³ãããå¿
èŠããããŸããããã§ã¯ãããŸããŸãªçš®é¡ã®ãªãœãŒã¹ã管çããæ¹æ³ã説æããŸãïŒ
ãã¯ã¹ãã£
gl.activeTexture(gl.TEXTURE0); // ãã¯ã¹ãã£ãŠããããæå¹åïŒå€ãã®å Žåãªãã·ã§ã³ã§ããæšå¥šïŒ
gl.bindTexture(gl.TEXTURE_2D, myDiffuseTexture);
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, myNormalMap);
ã¬ã€ã¢ãŠã修食åã䜿çšããŠããŠããWebGLãã¯ã¹ãã£ãªããžã§ã¯ãããã¯ã¹ãã£ãŠãããã«é¢é£ä»ããããã«ã¯ã`gl.activeTexture`ãš`gl.bindTexture`颿°ãäŸç¶ãšããŠå¿
èŠã§ããã·ã§ãŒããŒå
ã®layout修食åã¯ããã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ã«åºã¥ããŠã©ã®ãã¯ã¹ãã£ãŠããããããµã³ããªã³ã°ããããç¥ãããšãã§ããŸãã
Uniform Buffer Object (UBO)
UBOã®ç®¡çã«ã¯ããããã¡ãªããžã§ã¯ãã®äœæãç®çã®ãã€ã³ãã£ã³ã°ãã€ã³ããžã®ãã€ã³ãããããŠãããã¡ãžã®ããŒã¿ã³ããŒãå«ãŸããŸãã
// UBOãäœæ
const ubo = gl.createBuffer();
gl.bindBuffer(gl.UNIFORM_BUFFER, ubo);
gl.bufferData(gl.UNIFORM_BUFFER, bufferData, gl.DYNAMIC_DRAW);
// uniformãããã¯ã€ã³ããã¯ã¹ãååŸ
const matricesBlockIndex = gl.getUniformBlockIndex(program, "Matrices");
// UBOããã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ã
gl.uniformBlockBinding(program, matricesBlockIndex, 2); // ã·ã§ãŒããŒå
ã®layout(binding = 2)ã«å¯Ÿå¿
// ãããã¡ãuniformãããã¡ã¿ãŒã²ããã«ãã€ã³ã
gl.bindBufferBase(gl.UNIFORM_BUFFER, 2, ubo);
解説ïŒ
- ãããã¡ã®äœæïŒ`gl.createBuffer()`ã䜿çšããŠWebGLãããã¡ãªããžã§ã¯ããäœæããŸãã
- ãããã¡ã®ãã€ã³ãïŒ`gl.bindBuffer()`ã䜿çšããŠãããã¡ã`gl.UNIFORM_BUFFER`ã¿ãŒã²ããã«ãã€ã³ãããŸãã
- ãããã¡ããŒã¿ïŒ`gl.bufferData()`ã䜿çšããŠã¡ã¢ãªãå²ãåœãŠããããã¡ã«ããŒã¿ãã³ããŒããŸãã`bufferData`倿°ã¯éåžžãè¡åããŒã¿ãå«ã`Float32Array`ã§ãã
- ãããã¯ã€ã³ããã¯ã¹ã®ååŸïŒ`gl.getUniformBlockIndex()`ã䜿çšããŠãã·ã§ãŒããŒããã°ã©ã å ã®"Matrices"ãšããååã®uniformãããã¯ã®ã€ã³ããã¯ã¹ãååŸããŸãã
- ãã€ã³ãã£ã³ã°ã®èšå®ïŒ`gl.uniformBlockBinding()`ã䜿çšããŠãuniformãããã¯ã€ã³ããã¯ã¹ããã€ã³ãã£ã³ã°ãã€ã³ã2ã«ãªã³ã¯ããŸããããã«ãããWebGLã«uniformãããã¯"Matrices"ããã€ã³ãã£ã³ã°ãã€ã³ã2ã䜿çšããããšãäŒããŸãã
- ãããã¡ããŒã¹ã®ãã€ã³ãïŒæåŸã«ã`gl.bindBufferBase()`ã䜿çšããŠå®éã®UBOãã¿ãŒã²ãããšãã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãããŸãããã®ã¹ãããã§ãã·ã§ãŒããŒã§äœ¿çšããããã«UBOããã€ã³ãã£ã³ã°ãã€ã³ãã«é¢é£ä»ããããŸãã
Shader Storage Buffer Object (SSBO)
SSBOã¯UBOãšåæ§ã«ç®¡çãããŸãããç°ãªããããã¡ã¿ãŒã²ãããšãã€ã³ãã£ã³ã°é¢æ°ã䜿çšããŸãã
// SSBOãäœæ
const ssbo = gl.createBuffer();
gl.bindBuffer(gl.SHADER_STORAGE_BUFFER, ssbo);
gl.bufferData(gl.SHADER_STORAGE_BUFFER, particleData, gl.DYNAMIC_DRAW);
// ã¹ãã¬ãŒãžãããã¯ã€ã³ããã¯ã¹ãååŸ
const particlesBlockIndex = gl.getProgramResourceIndex(program, gl.SHADER_STORAGE_BLOCK, "Particles");
// SSBOããã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ã
gl.shaderStorageBlockBinding(program, particlesBlockIndex, 3); // ã·ã§ãŒããŒå
ã®layout(binding = 3)ã«å¯Ÿå¿
// ãããã¡ãã·ã§ãŒããŒã¹ãã¬ãŒãžãããã¡ã¿ãŒã²ããã«ãã€ã³ã
gl.bindBufferBase(gl.SHADER_STORAGE_BUFFER, 3, ssbo);
解説ïŒ
- ãããã¡ã®äœæïŒ`gl.createBuffer()`ã䜿çšããŠWebGLãããã¡ãªããžã§ã¯ããäœæããŸãã
- ãããã¡ã®ãã€ã³ãïŒ`gl.bindBuffer()`ã䜿çšããŠãããã¡ã`gl.SHADER_STORAGE_BUFFER`ã¿ãŒã²ããã«ãã€ã³ãããŸãã
- ãããã¡ããŒã¿ïŒ`gl.bufferData()`ã䜿çšããŠã¡ã¢ãªãå²ãåœãŠããããã¡ã«ããŒã¿ãã³ããŒããŸãã`particleData`倿°ã¯éåžžãããŒãã£ã¯ã«ããŒã¿ãå«ã`Float32Array`ã§ãã
- ãããã¯ã€ã³ããã¯ã¹ã®ååŸïŒ`gl.getProgramResourceIndex()`ã䜿çšããŠã"Particles"ãšããååã®ã·ã§ãŒããŒã¹ãã¬ãŒãžãããã¯ã®ã€ã³ããã¯ã¹ãååŸããŸãããªãœãŒã¹ã€ã³ã¿ãŒãã§ãŒã¹ãšããŠ`gl.SHADER_STORAGE_BLOCK`ãæå®ããå¿ èŠããããŸãã
- ãã€ã³ãã£ã³ã°ã®èšå®ïŒ`gl.shaderStorageBlockBinding()`ã䜿çšããŠãã·ã§ãŒããŒã¹ãã¬ãŒãžãããã¯ã€ã³ããã¯ã¹ããã€ã³ãã£ã³ã°ãã€ã³ã3ã«ãªã³ã¯ããŸããããã«ãããWebGLã«ã¹ãã¬ãŒãžãããã¯"Particles"ããã€ã³ãã£ã³ã°ãã€ã³ã3ã䜿çšããããšãäŒããŸãã
- ãããã¡ããŒã¹ã®ãã€ã³ãïŒæåŸã«ã`gl.bindBufferBase()`ã䜿çšããŠå®éã®SSBOãã¿ãŒã²ãããšãã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ãããŸãããã®ã¹ãããã§ãã·ã§ãŒããŒã§äœ¿çšããããã«SSBOããã€ã³ãã£ã³ã°ãã€ã³ãã«é¢é£ä»ããããŸãã
ãªãœãŒã¹ãã€ã³ãã£ã³ã°ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
WebGLã§ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãã管çããéã«åŸãã¹ããã¹ããã©ã¯ãã£ã¹ãããã€ã玹ä»ããŸãïŒ
- äžè²«ãããã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ã䜿çšããïŒãã¹ãŠã®ã·ã§ãŒããŒã§ãã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ãå²ãåœãŠãããã®äžè²«ããã¹ããŒã ãéžæããŸããããã«ãããã³ãŒãã®ä¿å®æ§ãåäžããç«¶åã®ãªã¹ã¯ãæžå°ããŸããäŸãã°ããã€ã³ãã£ã³ã°ãã€ã³ã0ã9ããã¯ã¹ãã£çšã«ã10ã19ãUBOçšã«ã20ã29ãSSBOçšã«äºçŽããããšãã§ããŸãã
- ãã€ã³ãã£ã³ã°ãã€ã³ãã®ç«¶åãé¿ããïŒåãã·ã§ãŒããŒã¹ããŒãžå ã§è€æ°ã®ãªãœãŒã¹ãåããã€ã³ãã£ã³ã°ãã€ã³ãã«ãã€ã³ããããŠããªãããšã確èªããŠãã ãããããã¯æªå®çŸ©ã®åäœãåŒãèµ·ãããŸãã
- ã¹ããŒãã®å€æŽãæå°éã«æããïŒç°ãªããã¯ã¹ãã£ãUBOãåãæ¿ããããšã¯ã³ã¹ãããããå ŽåããããŸããã¬ã³ããªã³ã°æäœãæŽçããŠãã¹ããŒã倿Žã®æ°ãæå°éã«æããããã«ããŠãã ãããåããªãœãŒã¹ã»ããã䜿çšãããªããžã§ã¯ããã°ã«ãŒãåããããšãæ€èšããŠãã ããã
- é »ç¹ãªuniformæŽæ°ã«ã¯UBOã䜿çšããïŒå€ãã®uniform倿°ãé »ç¹ã«æŽæ°ããå¿ èŠãããå Žåãåã ã®uniformãèšå®ãããããUBOã䜿çšããæ¹ãã¯ããã«å¹ççã§ããUBOã䜿çšãããšã1åã®ãããã¡æŽæ°ã§uniformã®ãããã¯ãæŽæ°ã§ããŸãã
- ãã¯ã¹ãã£é åãæ€èšããïŒå€ãã®é¡äŒŒãããã¯ã¹ãã£ã䜿çšããå¿ èŠãããå Žåã¯ããã¯ã¹ãã£é åã®äœ¿çšãæ€èšããŠãã ããããã¯ã¹ãã£é åã䜿çšãããšãè€æ°ã®ãã¯ã¹ãã£ã1ã€ã®ãã¯ã¹ãã£ãªããžã§ã¯ãã«æ ŒçŽã§ãããã¯ã¹ãã£ã®åãæ¿ãã«é¢é£ãããªãŒããŒããããåæžã§ããŸããã·ã§ãŒããŒã³ãŒãã¯ãuniform倿°ã䜿çšããŠé åã«ã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãã
- 説æçãªååã䜿çšããïŒãªãœãŒã¹ããã€ã³ãã£ã³ã°ãã€ã³ãã«èª¬æçãªååã䜿çšããŠãã³ãŒããçè§£ããããããŸããäŸãã°ããtexture0ãã®ä»£ããã«ãdiffuseTextureãã䜿çšããŸãã
- ãã€ã³ãã£ã³ã°ãã€ã³ããæ€èšŒããïŒå³å¯ã«ã¯å¿ é ã§ã¯ãããŸãããããã€ã³ãã£ã³ã°ãã€ã³ããæ£ããèšå®ãããŠããããšã確èªããããã®æ€èšŒã³ãŒãã远å ããããšãæ€èšããŠãã ãããããã«ãããéçºããã»ã¹ã®æ©ã段éã§ãšã©ãŒãææã§ããŸãã
- ã³ãŒãããããã¡ã€ãªã³ã°ããïŒWebGLãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠããªãœãŒã¹ãã€ã³ãã£ã³ã°ã«é¢é£ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãããããã®ããŒã«ã¯ããªãœãŒã¹ãã€ã³ãã£ã³ã°æŠç¥ãããã©ãŒãã³ã¹ã«ã©ã®ããã«åœ±é¿ããŠããããçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
äžè¬çãªèœãšã穎ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ããæ±ãéã«é¿ããã¹ãäžè¬çãªèœãšã穎ãããã€ã玹ä»ããŸãïŒ
- äžæ£ãªãã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ïŒæãäžè¬çãªåé¡ã¯ãã·ã§ãŒããŒãŸãã¯JavaScriptã³ãŒãã§äžæ£ãªãã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ã䜿çšããããšã§ãã
layout修食åã§æå®ããããã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ããJavaScriptã³ãŒãã§äœ¿çšããããã€ã³ãã£ã³ã°ã€ã³ããã¯ã¹ïŒäŸïŒUBOãSSBOããã€ã³ãããå ŽåïŒãšäžèŽããŠããããšãå確èªããŠãã ããã - ãã¯ã¹ãã£ãŠãããã®æå¹åãå¿ããïŒã¬ã€ã¢ãŠã修食åã䜿çšããŠããå Žåã§ãããã¯ã¹ãã£ããã€ã³ãããåã«æ£ãããã¯ã¹ãã£ãŠããããæå¹åããããšãéèŠã§ããæç€ºçã«ãã¯ã¹ãã£ãŠããããæå¹åããªããŠãWebGLãåäœããããšããããŸãããåžžã«ããããããšããã¹ããã©ã¯ãã£ã¹ã§ãã
- äžæ£ãªããŒã¿åïŒJavaScriptã³ãŒãã§äœ¿çšããŠããããŒã¿åããã·ã§ãŒããŒã³ãŒãã§å®£èšãããŠããããŒã¿åãšäžèŽããŠããããšã確èªããŠãã ãããäŸãã°ãUBOã«è¡åãæž¡ãå Žåããã®è¡åã`Float32Array`ãšããŠæ ŒçŽãããŠããããšã確èªããŠãã ããã
- ãããã¡ããŒã¿ã®ã¢ã©ã€ã¡ã³ãïŒUBOãSSBOã䜿çšããå ŽåãããŒã¿ã¢ã©ã€ã¡ã³ãèŠä»¶ã«æ³šæããŠãã ãããOpenGL ESã¯ãã°ãã°ãç¹å®ã®ããŒã¿åãç¹å®ã®ã¡ã¢ãªã¢ãã¬ã¹å¢çã«ã¢ã©ã€ã¡ã³ããããããšãèŠæ±ããŸãã
std140ã¬ã€ã¢ãŠã修食åã¯é©åãªã¢ã©ã€ã¡ã³ããä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãããããã§ãã«ãŒã«ãèªèããŠããã¹ãã§ããå ·äœçã«ã¯ãããŒã«åãšæŽæ°åã¯éåžž4ãã€ããæµ®åå°æ°ç¹åã¯4ãã€ããvec2ã¯8ãã€ããvec3ãšvec4ã¯16ãã€ããè¡åã¯16ãã€ãã®åæ°ã§ããæ§é äœã«ããã£ã³ã°ã远å ããŠããã¹ãŠã®ã¡ã³ããŒãæ£ããã¢ã©ã€ã¡ã³ããããããã«ããããšãã§ããŸãã - Uniformãããã¯ãã¢ã¯ãã£ãã§ãªãïŒuniformãããã¯ïŒUBOïŒãŸãã¯ã·ã§ãŒããŒã¹ãã¬ãŒãžãããã¯ïŒSSBOïŒãã·ã§ãŒããŒã³ãŒãã§å®éã«äœ¿çšãããŠããããšã確èªããŠãã ãããã³ã³ãã€ã©ãåç §ãããŠããªãããã«ãããã¯ãæé©åã§é€å»ããŠããŸããšããã€ã³ãã£ã³ã°ãæåŸ éãã«æ©èœããªãå¯èœæ§ããããŸãããããã¯å ã®å€æ°ããã®åçŽãªèªã¿åãã§ãããä¿®æ£ã§ããŸãã
- å€ããã©ã€ããŒïŒãªãœãŒã¹ãã€ã³ãã£ã³ã°ã®åé¡ã¯ãå€ãã°ã©ãã£ãã¯ã¹ãã©ã€ããŒãåå ã§ããããšããããŸããã°ã©ãã£ãã¯ã¹ã«ãŒãã«ææ°ã®ãã©ã€ããŒãã€ã³ã¹ããŒã«ãããŠããããšã確èªããŠãã ããã
ãã€ã³ãã£ã³ã°ãã€ã³ãã䜿çšããå©ç¹
- ããã©ãŒãã³ã¹ã®åäžïŒãã€ã³ãã£ã³ã°ãã€ã³ããæç€ºçã«å®çŸ©ããããšã§ãWebGLãã©ã€ããŒããªãœãŒã¹ã¢ã¯ã»ã¹ãæé©åããã®ãå©ããããšãã§ããŸãã
- ã·ã§ãŒããŒç®¡çã®ç°¡çŽ åïŒãã€ã³ãã£ã³ã°ãã€ã³ãã«ãããã·ã§ãŒããŒå ã®ãªãœãŒã¹ã®ç®¡çãšæŽæ°ã容æã«ãªããŸãã
- æè»æ§ã®åäžïŒãã€ã³ãã£ã³ã°ãã€ã³ãã«ãããã·ã§ãŒããŒã³ãŒãã倿ŽããããšãªããªãœãŒã¹ãåçã«åãæ¿ããããšãã§ããŸããããã¯ãè€éãªã¬ã³ããªã³ã°ãšãã§ã¯ããäœæããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
- å°æ¥æ§ïŒãã€ã³ãã£ã³ã°ãã€ã³ãã·ã¹ãã ã¯ããã¯ã¹ãã£ãŠãããã ãã«äŸåãããããçŸä»£çãªãªãœãŒã¹ç®¡çã¢ãããŒãã§ãããå°æ¥ã®ããŒãžã§ã³ã®WebGLã§ããµããŒããããå¯èœæ§ãé«ãã§ãã
é«åºŠãªãã¯ããã¯
ãã£ã¹ã¯ãªãã¿ã»ããïŒæ¡åŒµæ©èœïŒ
äžéšã®WebGLæ¡åŒµæ©èœãç¹ã«WebGPUæ©èœã«é¢é£ãããã®ã¯ããã£ã¹ã¯ãªãã¿ã»ããã®æŠå¿µãå°å ¥ããŠããŸãããã£ã¹ã¯ãªãã¿ã»ããã¯ããŸãšããŠæŽæ°ã§ãããªãœãŒã¹ãã€ã³ãã£ã³ã°ã®ã³ã¬ã¯ã·ã§ã³ã§ããããã«ããã倿°ã®ãªãœãŒã¹ãããå¹ççã«ç®¡çããæ¹æ³ãæäŸãããŸããçŸåšããã®æ©èœã¯äž»ã«å®éšçãªWebGPUå®è£ ããã³é¢é£ããã·ã§ãŒããŒèšèªïŒäŸïŒWGSLïŒãéããŠã¢ã¯ã»ã¹å¯èœã§ãã
鿥æç»
鿥æç»æè¡ã¯ãæç»ã³ãã³ããæ ŒçŽããããã«SSBOã«å€§ããäŸåããããšããããããŸãããããã®SSBOã®ãã€ã³ãã£ã³ã°ãã€ã³ãã¯ãGPUã«æç»ã³ãŒã«ãå¹ççã«ãã£ã¹ãããããããã«éèŠã«ãªããŸããããã¯ãè€éãªã¬ã³ããªã³ã°ã¢ããªã±ãŒã·ã§ã³ã«åãçµãã§ããå Žåã«æ¢æ±ãã䟡å€ã®ãããããé«åºŠãªãããã¯ã§ãã
çµè«
ãªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ããçè§£ã广çã«ç®¡çããããšã¯ãå¹ççã§æè»ãªWebGLã·ã§ãŒããŒãäœæããããã«äžå¯æ¬ ã§ããã¬ã€ã¢ãŠã修食åãUBOãSSBOã䜿çšããããšã§ããªãœãŒã¹ã¢ã¯ã»ã¹ãæé©åããã·ã§ãŒããŒç®¡çãç°¡çŽ åããããè€éã§é«æ§èœãªã¬ã³ããªã³ã°ãšãã§ã¯ããäœæã§ããŸãããã¹ããã©ã¯ãã£ã¹ã«åŸããäžè¬çãªèœãšã穎ãé¿ããã³ãŒãããããã¡ã€ãªã³ã°ããŠããªãœãŒã¹ãã€ã³ãã£ã³ã°æŠç¥ã广çã«æ©èœããŠããããšã確èªããŠãã ããã
WebGLãé²åãç¶ããã«ã€ããŠããªãœãŒã¹ãã€ã³ãã£ã³ã°ãã€ã³ãã¯ããã«éèŠã«ãªããŸãããããã®æè¡ãç¿åŸããããšã§ãWebGLã¬ã³ããªã³ã°ã®ææ°ã®é²æ©ã掻çšããããã®æºåãæŽããŸãã